package com.common.weibolib;

import java.util.ArrayList;

import org.json.JSONException;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.view.View;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.GridView;

import com.common.activity.TweetFlowImageActivity;
import com.common.utils.StarAppUtils;
import com.starappallcommon.R;
/**
 * GridView的高度可以wrapcontent的控件
 * 
 * <br>Created 2014-5-23 上午11:38:20
 * @version  
 * @author   chenqian		
 *
 * @see
 */
public class WrapContentGridView extends GridView {
	public static final int MIN_SNAP_SIZE = 240;
	/**
	 * WrapContentGridView的构造函数
	 * Creates a new instance of WrapContentGridView.
	 * <br>Created 2014-6-5 下午1:48:01
	 * @param context 上下文
	 */
	public WrapContentGridView(Context context) {
		super(context);
	}

	/**
	 * WrapContentGridView的构造函数
	 * Creates a new instance of WrapContentGridView.
	 * <br>Created 2014-6-5 下午1:48:32
	 * @param context 上下文
	 * @param attrs attrs
	 */
	public WrapContentGridView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	/**
	 * WrapContentGridView的构造函数
	 * Creates a new instance of WrapContentGridView.
	 * <br>Created 2014-6-5 下午1:48:56
	 * @param context 上下文
	 * @param attrs attrs
	 * @param defStyle defStyle
	 */
	public WrapContentGridView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		int heightSpec;

		if (getLayoutParams().height == LayoutParams.WRAP_CONTENT) {
			// The great Android "hackatlon", the love, the magic.
			// The two leftmost bits in the height measure spec have
			// a special meaning, hence we can't use them to describe height.
			heightSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
					MeasureSpec.AT_MOST);
		} else {
			// Any other height should be respected as is.
			heightSpec = heightMeasureSpec;
		}

		int widthSpec = widthMeasureSpec;
		super.onMeasure(widthSpec, heightSpec);
	}

	/**
	 * 和图片数据绑定
	 * 
	 * <br>Created 2014-5-23 上午11:46:39
	 * @param context 上下文
	 * @param ti 微博
	 * @param isCommentTweet 是否是微博详情
	 * @param level 第几层（转发图片微博时，图片通常处于第二层）
	 * @return 图片的路径
	 * @author       chenqian
	 */
	public ArrayList<String> bindImageData(final Context context,
			final TopicInfo ti,
			final boolean isCommentTweet, int level) {
		if (null == ti.image || ti.image.isEmpty()) {
			return null;
		}
		//存放图片缩略图路径
		final ArrayList<String> imageUrls = new ArrayList<String>();
		//存放图片原图路径
		final ArrayList<String> sourceImageUrls = new ArrayList<String>();
		//图片扩展名
		final ArrayList<String> imageExts = new ArrayList<String>();
		String url1, url2;
		int width = 0, height = 0;
		int scalesSize = ti.image.size();
		final float[] scales = new float[scalesSize];
		float ratio = 1.0f;
		ImageList imageList = ti.image;
		for (int i = 0; i < imageList.size(); i++) {
			Image img = imageList.get(i);
			url2 = img.image_original;
			sourceImageUrls.add(TextUtils.isEmpty(url2) ? "" : url2);
			imageExts.add(img.image_ext);
			if (Utils.isLocalTopic(ti)) {//本地微博
				url1 = img.image_original;
				imageUrls.add(TextUtils.isEmpty(url1) ? "" : url1);
			} else if (!ti.isOnlySina) {//企业微博
				width = img.image_width;
				height = img.image_height;
				//按照微博规定的图片大小限制来计算图片的宽高使得图片缩放不变形
				int result[] = resizerTweetImage(width, height);
				scales[i] = width / (float) result[2];
				if (!isCommentTweet) {
					if (i == 0) {
						width = result[0];
						height = result[1];
					}
				}
				ratio = (float) height / width;
				if (width < MIN_SNAP_SIZE
						&& height < MIN_SNAP_SIZE) {// 缩略图小到一定程度，上原图
					imageUrls.add(url2);
				} else {
					url1 = img.image_thumb;
					imageUrls.add(TextUtils.isEmpty(url1) ? url2 : url1);
				}
			} else {// 新浪微博的图片微博
				if (isCommentTweet) {
					url1 = img.image_middle;
				} else {
					url1 = img.image_thumb;
				}
				url2 = img.image_original;
				imageUrls.add(TextUtils.isEmpty(url1) ? url2 : url1);
				sourceImageUrls.add(TextUtils.isEmpty(url2) ? "" : url2);
				scales[0] = 1;
				imageExts.add(img.image_ext);
			}
		}


		boolean isLocalTweet = Utils.isLocalTopic(ti);
		//本地图片的宽高，服务端无法给出，要自己计算
		if (isLocalTweet && (1 == imageUrls.size())) {
			final String thumbnail = imageUrls.get(0);
			width = 0;
			height = 0;
			BitmapFactory.Options options = new BitmapFactory.Options();
			options.inJustDecodeBounds = true;
			BitmapFactory.decodeFile(thumbnail, options);
			width = options.outWidth;
			height = options.outHeight;
			int result[] = resizerTweetImage(width, height);
			scales[0] = width / (float) result[2];
			width = result[0];
			height = result[1];
		}

		//如果是微博详情，图片大小的限制有另外一套规则。。。
		if (isCommentTweet) {
			int layoutWidth =  StarAppUtils.getInstance().readDisplayMetrics().x
                    - ((int) context.getResources().getDimension(
							R.dimen.ui_margin) * 5) * level;
			//图片只有一张的情况下尽量撑满屏幕
			if (sourceImageUrls.size() == 1) {
				if ((width > 0 && width < (layoutWidth >> 1))) {
					layoutWidth = width;
				}
				width = layoutWidth;
				height = (int) (width * ratio);
				initData(context, sourceImageUrls, imageExts,width, height, isLocalTweet,
						isCommentTweet);
			} else {//多张的情况则放到gridView中显示
				initData(context, sourceImageUrls, imageExts, layoutWidth, height,
						isLocalTweet, isCommentTweet);
			}
		} else {//非微博详情，则使用微博列表的图片显示规则。。。
			initData(context, imageUrls, imageExts, width, height, isLocalTweet,
					isCommentTweet);
		}

		setVisibility(View.VISIBLE);
		//点击图片则进入大图浏览
		setOnItemClickListener(new OnItemClickListener() {
			@Override
			public void onItemClick(AdapterView<?> parent, View view,
					int position, long id) {
				startTweetFlowImageActivity(context, ti, sourceImageUrls,
						imageUrls, position,scales);
			}
		});
		return sourceImageUrls;

	}

	/**
	 * 进入大图浏览界面
	 * 
	 * <br>Created 2014-5-23 上午11:52:44
	 * @param context 上下文
	 * @param ti 微博
	 * @param urls 图片地址
	 * @param thumbnails 缩略图地址
	 * @param position 首先展示的图片位置
	 * @param scales 图片的缩放比例
	 * @author       chenqian
	 */
	protected void startTweetFlowImageActivity(Context context, TopicInfo ti,
			ArrayList<String> urls, ArrayList<String> thumbnails, int position, float[] scales) {
		if (null == urls && (ti == null || null == ti.image || ti.image.isEmpty())) {
			return;
		}
		Intent intent = new Intent(context, TweetFlowImageActivity.class);
		intent.putExtra("position", position);
		if(null != urls){
			intent.putStringArrayListExtra("urls", urls);
		}
		if(null != scales){
			intent.putExtra("scales", scales);
		}		
		if (null != ti) {
			String str = "";
			try {
				str = new TopicInfoParser().toJSONObject(ti).toString();
			} catch (JSONException e) {
				e.printStackTrace();
			}
			intent.putExtra("topicinfo", str);
		}
		if(context instanceof Activity){
			((Activity)context).startActivityForResult(intent, 1012);
		}else{
			context.startActivity(intent);
		}
	}

	/**
	 * 用gridview显示图片
	 * @n<b>函数名称</b> :initData
	 * @brief
	 * @see
	 * @since Ver 1.1
	 * @param @param context 上下文
	 * @param @param imageUrls 图片的url
	 * @param @param width 图片的宽
	 * @param @param height 图片的高
	 * @param @param isLocalTweet 是否为本地微博
	 * @param @param isCommentTweet 是否是在微博详情的activity
	 * @return void
	 * @<b>作者</b> : zhuhp
	 * @<b>创建时间</b> : 2014-1-2下午3:59:31
	 */
	public void initData(Context context, final ArrayList<String> imageUrls,final ArrayList<String> imgExts,
			int width, int height, boolean isLocalTweet, boolean isCommentTweet) {
		TweetImageAdapter adapter = (TweetImageAdapter) getAdapter();
		if (null == adapter)
			adapter = new TweetImageAdapter(context);
		adapter.setData(imageUrls,imgExts);
		adapter.setIsLocalImg(isLocalTweet);
		int itemWidth = 0;
		//计算默认尺寸		
		if (isCommentTweet) {
		//如果是详情，为了撑满屏幕显示，girdview的每个item默认尺寸较大
			itemWidth = (int) context.getResources().getDimension(
					R.dimen.dip_size_120);
		} else {
		//如果是微博列表，不需要撑满屏幕显示，girdview的每个item默认尺寸较小
			itemWidth = (int) context.getResources().getDimension(
					R.dimen.dip_size_70);
		}
		//如果尺寸固定，则使用固定尺寸，否则使用默认尺寸
		if (width > 0) {
			getLayoutParams().width = width;
		} else {
			getLayoutParams().width = itemWidth;
		}		
		if (imageUrls.size() == 1) {
			//如果只有一张图，要设置girdview的列数为1
			if (width > 0 && height > 0) {
				adapter.setImgSize((int) width, (int) height);
			} else {
				adapter.setImgSize(itemWidth, itemWidth);
			}
			setNumColumns(1);
		} else if (imageUrls.size() == 4) {
			//如果有4张图，要设置girdview的列数为2
			adapter.setImgSize(itemWidth, itemWidth);
			setNumColumns(2);
			if (isCommentTweet) {
				getLayoutParams().width = width / 3 * 2;
			} else {
				getLayoutParams().width = (int) (itemWidth * 2 + context
						.getResources().getDimension(R.dimen.dip_size_2));
			}
		} else {
			//其他，要设置girdview的列数为3
			adapter.setImgSize((int) itemWidth, (int) itemWidth);
			setNumColumns(3);
			if (!isCommentTweet)
				getLayoutParams().width = (int) (itemWidth * 3 + context
						.getResources().getDimension(R.dimen.dip_size_2) * 2);
		}
		setAdapter(adapter);
	}

	/**
	 * 控制图片缩放
	 * 
	 * <br>Created 2014-5-23 上午11:57:44
	 * @param width 原图宽度
	 * @param height 原图高度
	 * @return 缩放后的宽高
	 * @author       chenqian
	 */
	public static int[] resizerTweetImage(int width, int height) {
		int[] size = new int[4];
		int result[] = resizerImageview(width, height);
		size[2] = result[0];//存放缩放后的宽度
		size[3] = result[1];//存放缩放后的长度
		if (width > result[0]) {
			width = result[0];
		}
		if (height > result[1]) {
			height = result[1];
		}
		size[0] = width;//存放截断后的宽度
		size[1] = height;//存放截断后的长度
		return size;
	}

	/**
	 * 计算图片在固定大小限制下的缩放的长宽值
	 * 
	 * <br>Created 2014-5-23 上午11:58:11
	 * @param width 原图宽度
	 * @param height 原图高度
	 * @return 缩放后的宽高
	 * @author       chenqian
	 */
	public static int[] resizerImageview(int width, int height) {
		int max_height = 240;
		int max_widht = 70;
		int[] result = { width, height };
		float scale = 240 / 70f;
		float flag = 1f * height / width;
		float flag2 = 1f * width / height;

		// 长度和宽度都 ≦ 240原图显示
		if (width > max_height || height > max_height) {
			if (height > width) {// 高度大于宽度
				if (flag < scale) {// 原始图片的高宽比 ≦ 240 : 70
					width = max_height * width / height;
					height = max_height;// 原始图片的高度缩放到240px
				} else {
					height = max_height;
					width = max_widht;
				}
			} else {// 宽度大于高度
				if (flag2 < scale) {// 原始图片的宽高比 ≦ 240 : 70
					height = max_height * height / width;
					width = max_height;// 原始图片的宽度缩放到240px
				} else {
					height = max_widht;
					width = max_height;
				}
			}
		}

		result[0] = width;
		result[1] = height;
		return result;
	}

}
